#include <string>
#include <vector>
#include <stdio.h>
#include <string.h>
#include <cmath>
#include <queue>
#include <algorithm>
#include <iostream>
// #define PI 3.14159265358979323846264338327950288
#define _clr(a,b) memset(a,b,sizeof(a))
template<class T> T _abs(T a)
{ if(a<0) return -a;return a;}
template<class T> void get_min(T& a,T b)
{ if(a>b) a=b;}
template<class T> void get_max(T& a,T b)
{ if(a<b) a=b;}
using namespace std;

vector<int> edges[155];
int N,P;
int DP[155][155];
const int INF=1000;
bool flag[155];
void DFS(int root)
{
	for(int i=0;i<edges[root].size();i++) DFS(edges[root][i]);
	for(int i=0;i<edges[root].size();i++)
	{
		for(int p=P;p>1;p--)//因为DP[root][p]受DP[root][p-k]影响，所以p应该是反着循环。
		{
			for(int k=1;k<p;k++)
			{
				get_min(DP[root][p],DP[edges[root][i]][k]+DP[root][p-k]-2);
			}
		}
	}
}
int main()
{
	_clr(flag,0);
	int start,end;
	scanf("%d%d",&N,&P);
	for(int i=0;i<N-1;i++)
	{
		scanf("%d%d",&start,&end);
		edges[start].push_back(end);
		flag[end]=true;
	}
	int root=1;
	while(flag[root]) root++;
	for(int i=1;i<=N;i++)
	{
		for(int j=2;j<=P;j++)
		{
			DP[i][j]=INF;
		}
		DP[i][1]=edges[i].size()+1;
	}
	DFS(root);
	DP[root][P]--;//整棵树的根节点是无父节点的，所以之前多加了一，现在帮它减去
	int ans=INF;
	for(int i=1;i<=N;i++) get_min(ans,DP[i][P]);
	printf("%d\n",ans);
	return 0;
}